package view;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;

import kernel.GeraEventoSim;
import kernel.Valores;

public class FrameSimulacao extends JFrame {

	/*
	 * Componentes devem estar no contexto da instância, para que possam ser
	 * acessados em todos os métodos não-estáticos da classe
	 */

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	//textarea onde serao exibidos os resultados das filas
	private JTextArea resultado = new JTextArea();
	
	//radios usados para escolher a taxa de utilizacao do sistema
	private JRadioButton taxaRadio2 = new JRadioButton("0.2");
	private JRadioButton taxaRadio4 = new JRadioButton("0.4");
	private JRadioButton taxaRadio6 = new JRadioButton("0.6");
	private JRadioButton taxaRadio8 = new JRadioButton("0.8");
	private JRadioButton taxaRadio9 = new JRadioButton("0.9");
	
	//botao q tem a acao de executar o simulador
	private JButton executaSimulacaoButton = new JButton("Rodar simulador");
	
	//botao de Label da taxa de utilizacao
	private JLabel labelTaxaUtilizacao = new JLabel("Escolha a taxa de utilização");
	
	//grupo dos radios para selecionar apenas 1
	private ButtonGroup groupRadioTaxaUtilizacao = new ButtonGroup();
	
	//panel com os radios para layout
	private JPanel radioPanel = new JPanel(new GridLayout(0, 1));

	//taxa de servico q sera passada para o gerador, apos escolha de um dos radios
	private Double taxaServico;
	
	//string de quebra de linha para formatacao do textarea
	static private final String newline = "\n";
	
	public FrameSimulacao() {
		// Define o título da janela
		super("Trabalho de AD sobre simulação");
		this.montaJanela();
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	private void montaJanela() {
		
		groupRadioTaxaUtilizacao.add(taxaRadio2);
	    groupRadioTaxaUtilizacao.add(taxaRadio4);
	    groupRadioTaxaUtilizacao.add(taxaRadio6);
	    groupRadioTaxaUtilizacao.add(taxaRadio8);
	    groupRadioTaxaUtilizacao.add(taxaRadio9);
	    
	    radioPanel.add(labelTaxaUtilizacao);
	    radioPanel.add(taxaRadio2);
	    radioPanel.add(taxaRadio4);
	    radioPanel.add(taxaRadio6);
	    radioPanel.add(taxaRadio8);
	    radioPanel.add(taxaRadio9);
	    radioPanel.add(executaSimulacaoButton);
		
		this.getContentPane().add(radioPanel, BorderLayout.LINE_START);
		this.getContentPane().add(resultado);
		
		
		//adicionando listener no botao para executar o simulador e carregar os valores
		this.executaSimulacaoButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				loadValues(evt);
				startSimulador();
			}
		});
	}
	
	private void loadValues(ActionEvent evt) {
		
		if (this.groupRadioTaxaUtilizacao.getSelection() == null) {
			JOptionPane.showMessageDialog(this,
					"Selecione um nível de utilização", "Erro", 0);
			return;
		}

		//verifica o radio selecionado, para pegar a taxa de servico selecionada
		if (this.taxaRadio2.isSelected())
			taxaServico = 0.1;
		else if (this.taxaRadio4.isSelected())
			taxaServico = 0.2;
		else if (this.taxaRadio6.isSelected())
			taxaServico = 0.3;
		else if (this.taxaRadio8.isSelected())
			taxaServico = 0.4;
		else if (this.taxaRadio9.isSelected())
			taxaServico = 0.45;

		this.resultado.setText("");
		
		//this.executaSimulacaoButton.setEnabled(false);
		
	}

	private void startSimulador() {
		
		//tempo atual
		long start = System.currentTimeMillis();  
		
		resultado.append("Simulação iniciada ... " + newline);

		if (taxaServico != null) {
			resultado
					.append("A taxa de utilização do servidor escolhida foi a taxa : "
							+ taxaServico * 2 + "..." + newline);
			Valores.txChegada = taxaServico;

		} else {
			resultado.append("Erro ao escolher a taxa ...");
			return;
		}
		resultado.append("Começando simulação ... " + newline);

		//Instancia o gerador de eventos
		if(GeraEventoSim.geradorEvSimulacao != null){
			GeraEventoSim.geradorEvSimulacao = null;
		}
		
		GeraEventoSim gerador = GeraEventoSim.getInstance();

		//Entra em loop infinito para atender os eventos
		while (gerador.atenderEventoSeguinte())
			;
		
		//calcula o tempo de execucao em funcao do corrente e do start
		long delay = (System.currentTimeMillis() - start);
		long segundos = delay /1000;
		
		//passa resultado do simulador pro textarea da tela
		resultado.append(gerador.getResult());
		
		resultado.append("\nTempo de execução do simulador (em mileseg): " + delay);
		resultado.append("\nTempo de execução do simulador (em seg): " + segundos);

		//forca repaint para atualizar a tela e mostrar o resultado
		resultado.repaint();
		
	}

}
